package springmvc.high.controller;

import springmvc.high.pojo.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * description: 声明式异常处理
 * TODO：统一异常处理验证构造异常、参数校验
 *
 * 统一异常处理：
 * 1. @RestController = @ResponseBody + @Controller
 * 2. @RequestMapping、@PostMapping
 * 3. 构造异常，方法data()、data1()
 *
 * 参数校验：
 * 1. handler(@validated 实体类 对象)，接收有参数校验注解标识的实体类，使用 @Validated 注解使参数校验生效
 * 2. 如果传参是 json 格式，形参添加 @RequestBody 注解
 * 3. 不符合校验规则，默认直接向前端抛出异常
 * 4. 通过 'BindingResult result' 接收错误信息，可以自定义报错时的返回结果
 * 5. handler(@Validated 实体类 对象, BindingResult result) BindingResult 必须紧挨校验对象
 * 6. 捕获异常可以通过 Map 返回
 */

@RestController
@RequestMapping("user")
public class UserController {

    @PostMapping("register")
    public Object register(@Validated @RequestBody User user, BindingResult result){

        // 捕获校验异常
        if (result.hasErrors()) {
            Map data = new HashMap();
            data.put("code",400);
            data.put("msg","参数校验异常了！");
            return data;
        }

        System.out.println("user = " + user);
        return user;
    }

    @GetMapping("data")
    public String data(){
        // 构造空指针异常
        String name = null;
        System.out.println("UserController.data");
        //空指针异常 NullPointerException
        name.toString();
        return "ok";
    }

    @GetMapping("data1")
    public String data1(){
        // 构造算数异常
        System.out.println("UserController.data1");
        //除零异常 ArithmeticException
        int i = 1/0;
        return "ok";
    }
}
